package concurrent.chapter1;

import java.util.stream.IntStream;

/**
 * 03讲、介绍三种高效优雅的Singleton实现方式
 */
//Doug大神推荐的方式
//枚举的方式，汪文君写过一本关于枚举的书，可以看看
//枚举的构造方法是私有的，枚举类是final的
public class SingletonObject7 {

    private SingletonObject7() {
    }

    //枚举类型是线程安全的，构造函数只会被装载一次
    private enum Singleton {
        INSTANCE;
        private final SingletonObject7 instance;

        Singleton() {
            instance = new SingletonObject7();
        }

        public SingletonObject7 getInstance() {
            return instance;
        }
    }

    public static SingletonObject7 getInstance() {
        return Singleton.INSTANCE.getInstance();
    }

    public static void main(String[] args) {
        IntStream.rangeClosed(1, 100)
                .forEach(i -> new Thread(String.valueOf(i)) {
                    @Override
                    public void run() {
                        System.out.println(SingletonObject7.getInstance());
                    }
                }.start());
    }
}
